package lanQiaoBei.搜索与图论.dfs;
import java.io.*;
import java.math.*;
import java.util.*;
/*树的重心
* 题目描述

给定一颗树，树中包含 n 个结点（编号 1∼n）和 n−1条无向边。

请你找到树的重心，并输出将重心删除后，剩余各个连通块中点数的最大值。

重心定义：重心是指树中的一个结点，如果将这个点删除后，剩余各个连通块中点数的最大值最小，那么这个节点被称为树的重心。

输入格式

第一行包含整数 n，表示树的结点数。

接下来 n−1行，每行包含两个整数 a 和 b，表示点 a 和点 b之间存在一条边。

输出格式

输出一个整数 m

，表示将重心删除后，剩余各个连通块中点数的最大值。

数据范围

1≤n≤10^5

输入样例

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6
输出样例：

4
* */
public class P4 {
    static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    final static int N=100010,M=2*N;
    static int n,m=N,idx;
    static int[]h=new int[N],e=new int[M],ne=new int[M];
    static boolean[]isSearch=new boolean[N];

    static void add(int a,int b){//a,b之间连一条边
           e[idx]=b;ne[idx]=h[a];h[a]=idx++;
    }
    static void scan()throws Exception{
           n=Integer.parseInt(br.readLine());
           Arrays.fill(h,-1);
           for(int i=0;i<n-1;i++) {
               String[] ss = br.readLine().split(" ");
               int a = Integer.parseInt(ss[0]), b = Integer.parseInt(ss[1]);
               add(a, b);
               add(b, a);
           }
    }
    static int dfs(int node){//返回当前节点树的数量
           isSearch[node]=true;
           int sum=1,res=0;
           for(int i=h[node];i!=-1;i=ne[i]){
               if(!isSearch[e[i]]){
                  int s= dfs(e[i]);
                  sum+=s;
                  res=Math.max(s,res);
               }
           }
           res=Math.max(res,n-sum);
           m=Math.min(res,m);
           return sum;
    }
    public static void main(String[]args)throws Exception{
           scan();
           dfs(1);
           System.out.print(m);
    }

}
